#include "config.h"
#include "shell-app-system.h"
+#include "shell-app-usage.h"
#include <string.h>
#include <gio/gio.h>
static gint
-compare_apps_by_name (gconstpointer a,
- gconstpointer b,
- gpointer data)
+compare_apps_by_usage (gconstpointer a,
+ gconstpointer b,
+ gpointer data)
{
+ ShellAppUsage *usage = shell_app_usage_get_default ();
+
ShellApp *app_a = (ShellApp*)a;
ShellApp *app_b = (ShellApp*)b;
- return shell_app_compare_by_name (app_a, app_b);
+ return shell_app_usage_compare (usage, "", app_a, app_b);
}
static GSList *
GSList *substring_matches)
{
multiple_prefix_matches = g_slist_sort_with_data (multiple_prefix_matches,
- compare_apps_by_name,
+ compare_apps_by_usage,
system);
prefix_matches = g_slist_sort_with_data (prefix_matches,
- compare_apps_by_name,
+ compare_apps_by_usage,
system);
multiple_substring_matches = g_slist_sort_with_data (multiple_substring_matches,
- compare_apps_by_name,
+ compare_apps_by_usage,
system);
substring_matches = g_slist_sort_with_data (substring_matches,
- compare_apps_by_name,
+ compare_apps_by_usage,
system);
return g_slist_concat (multiple_prefix_matches, g_slist_concat (prefix_matches, g_slist_concat (multiple_substring_matches, substring_matches)));
}
return apps;
}
+
+/**
+ * shell_app_usage_compare:
+ * @self: the usage instance to request
+ * @context: Activity identifier
+ * @app_a: First app
+ * @app_b: Second app
+ *
+ * Compare @app_a and @app_b based on frequency of use.
+ *
+ * Returns: -1 if @app_a ranks higher than @app_b, 1 if @app_b ranks higher
+ * than @app_a, and 0 if both rank equally.
+ */
+int
+shell_app_usage_compare (ShellAppUsage *self,
+ const char *context,
+ ShellApp *app_a,
+ ShellApp *app_b)
+{
+ GHashTable *usages;
+ UsageData *usage_a, *usage_b;
+
+ usages = g_hash_table_lookup (self->app_usages_for_context, context);
+ if (usages == NULL)
+ return 0;
+
+ usage_a = g_hash_table_lookup (usages, shell_app_get_id (app_a));
+ usage_b = g_hash_table_lookup (usages, shell_app_get_id (app_b));
+
+ if (usage_a == NULL && usage_b == NULL)
+ return 0;
+ else if (usage_a == NULL)
+ return 1;
+ else if (usage_b == NULL)
+ return -1;
+
+ return usage_b->score - usage_a->score;
+}
+
static void
ensure_queued_save (ShellAppUsage *self)
{
GSList *shell_app_usage_get_most_used (ShellAppUsage *usage,
const char *context,
gint max_count);
+int shell_app_usage_compare (ShellAppUsage *self,
+ const char *context,
+ ShellApp *app_a,
+ ShellApp *app_b);
G_END_DECLS